package com.proyecto.track.dao;

import java.util.List;

import org.apache.log4j.Logger;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.support.DataAccessUtils;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import org.springframework.transaction.annotation.Transactional;

import com.proyecto.track.action.ProyectoAction;
import com.proyecto.track.bo.Usuario;

/**
 * La implementación del DAO de usuario.
 */
@Transactional(rollbackFor = Exception.class)
public class UsuarioDAOImp extends HibernateDaoSupport implements UsuarioDAO {

	private Logger log = Logger.getLogger(ProyectoAction.class);

	/**
	 * Inits the session factory.
	 * 
	 * @param factory
	 *            the factory
	 */
	@Autowired
	public void initSessionFactory(SessionFactory factory) {
		setSessionFactory(factory);
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see
	 * com.proyecto.track.dao.UsuarioDAO#guardarUsuario(com.proyecto.track.bo
	 * .Usuario)
	 */
	public Long guardarUsuario(Usuario usuario) {
		super.getHibernateTemplate().save(usuario);
		return usuario.getIdUsuario();
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see
	 * com.proyecto.track.dao.UsuarioDAO#actualizarUsuario(com.proyecto.track
	 * .bo.Usuario)
	 */
	public void actualizarUsuario(Usuario usuario) {
		super.getHibernateTemplate().update(usuario);
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see com.proyecto.track.dao.UsuarioDAO#borrarUsuario(java.lang.Long)
	 */
	public void borrarUsuario(Long id) {
		Usuario p = (Usuario) super.getHibernateTemplate().load(Usuario.class,
				id);
		super.getHibernateTemplate().delete(p);
	}

	@SuppressWarnings("unchecked")
	public List<Usuario> getAllUsuarios() {
		return super.getHibernateTemplate().find("from Usuario");
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see com.proyecto.track.dao.UsuarioDAO#getUsuarioById(java.lang.Long)
	 */
	public Usuario getUsuarioById(Long id) {
		return (Usuario) super.getHibernateTemplate().get(Usuario.class, id);
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see
	 * com.proyecto.track.dao.UsuarioDAO#getUsuariosAsignadosForProyecto(java
	 * .lang.Long)
	 */
	@SuppressWarnings("unchecked")
	public List<Usuario> getUsuariosAsignadosForProyecto(Long idProyecto) {
		return super
				.getHibernateTemplate()
				.find(
						"select p.recursosAsignados from Proyecto as p where idProyecto = :idProyecto");

	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see
	 * com.proyecto.track.dao.UsuarioDAO#getUsuariosForTarea(java.lang.Long)
	 */
	@SuppressWarnings("unchecked")
	public List<Usuario> getUsuariosForTarea(Long idTarea) {
		return super.getHibernateTemplate().find(
				"select t.asignados from Tarea as t where idTarea = :idTarea");

	}

	@SuppressWarnings("unchecked")
	public Usuario getUsuarioByUsername(String nombreUsuario) {
		
		String query = "FROM Usuario u WHERE u.nombre = " + "'" + nombreUsuario + "'";
		return (Usuario) DataAccessUtils.uniqueResult(super.getHibernateTemplate().find(query));

	}

	@SuppressWarnings("unchecked")
	public Usuario getUsuarioByName(String nombreLogin) {
		log.info(this.getClass().getCanonicalName() + " Consultando si existe el usuario");
		return (Usuario)DataAccessUtils.uniqueResult(super.getHibernateTemplate().find("from Usuario as u where u.nombre =?", nombreLogin));
	}
}
